package com.payment.mapper.alast;

import com.payment.entity.alast.common.*;
import com.payment.entity.alast.stripe.StripePaymentTransaction;
import com.payment.entity.payresults.PayPalNotificationPaymentResults;
import com.payment.entity.payresults.PayPalPaymentResults;
import com.payment.entity.payresults.WeiXinNotificationPaymentResults;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
/**
 * @author lm
 * @date 2020/8/3 14:31
 */
public interface PaymentAndResultMapper {

    /**
     * 成功的：微信或者payPal支付结果查询
     *
     * @param partnerCode
     * @param payId
     * @return
     */
    List<ServicePlanOrderRecord> querySuccessfulOrderRecords(@Param("partnerCode") String partnerCode,
                                                             @Param("payId") String payId);

    /**
     * 记录：微信或者payPal支付结果查询
     *
     * @param partnerCode
     * @param payId
     * @return
     */
    List<ServicePlanOrderRecord> queryRecordExists(@Param("partnerCode") String partnerCode,
                                                   @Param("payId") String payId);

    /**
     * 根据单号查询数据记录条数
     * 在记录表中查询
     *
     * @param payId
     * @return
     */
    Integer findPayIdCount(@Param("payId") String payId);

    /**
     * 根据单号查询成功的数据记录条数
     * 在记录表中查询
     *
     * @param payId
     * @return
     */
    Integer findSuccessCountByRecord(@Param("payId") String payId);

    /**
     * 根据单号查询数据记录条数
     * 在历史表中查询
     *
     * @param payId
     * @return
     */
    Integer findPayIdHistCount(@Param("payId") String payId);

    /**
     * 根据payId查询订单记录
     *
     * @param payId
     * @return
     */
    List<ServicePlanOrderRecord> queryRecordHistList(@Param("payId") String payId);

    /**
     * 更新数据表：service_plan_order_record_t
     *
     * @param record
     * @return
     */
    Integer updateOrderRecordT(ServicePlanOrderRecord record);

    /**
     * 更新数据表：service_plan_order_record_hist_t
     *
     * @param record
     * @return
     */
    Integer updateOrderRecordHistT(ServicePlanOrderRecord record);

    /**
     * 查询是否已经存在这条支付记录
     *
     * @param payId
     * @param transactionId
     * @param payRst
     * @return
     */
    Integer queryPaymentCount(@Param("payId") String payId,
                              @Param("transactionId") String transactionId,
                              @Param("payRst") String payRst);

    /**
     * 写入支付记录数据：service_plan_order_payment_t
     *
     * @param payment
     * @return
     */
    Integer insertOrderPaymentT(ServicePlanOrderPayment payment);

    /**
     * 写入支付订单记录数据：service_plan_order_record_t
     *
     * @param re
     * @return
     */
    Integer insertOrderRecordT(ServicePlanOrderRecord re);

    /**
     * 查询微信记录表中是否已有数据
     * payment_transaction_weixin_t
     *
     * @param outTradeNo
     * @param transactionId
     * @return
     */
    Integer findWeiXinResultCount(@Param("outTradeNo") String outTradeNo,
                                  @Param("transactionId") String transactionId);

    /**
     * 写入微信支付记录数据
     * <p>
     * payment_transaction_weixin_t
     *
     * @param results
     * @return
     */
    Integer insertWeiXinResults(WeiXinNotificationPaymentResults results);

    /**
     * 根据渠道编码查询对应的密钥secret
     *
     * @param partnerCode
     * @return
     */
    String findSecretByPartnerCode(@Param("partnerCode") String partnerCode);

    /**
     * 根据payId查询订单记录内容
     *
     * @param payId
     * @param mark
     * @return
     */
    List<ServicePlanOrderRecord> queryOrderRecordList(@Param("payId") String payId,
                                                      @Param("mark") String mark);

    /**
     * 根据渠道编码和套餐编码查询套餐的属性：buyType和priceType
     *
     * @param partnerCode
     * @param packageCode
     * @return
     */
    List<PartnerPackage> queryType(@Param("partnerCode") String partnerCode,
                                   @Param("packageCode") String packageCode);

    /**
     * 根据invoice和txnId查询支付结果是否已经入库
     *
     * @param invoice
     * @param txnId
     * @return
     */
    Integer findResultsCountByInvoice(@Param("invoice") String invoice,
                                      @Param("txnId") String txnId);

    /**
     * payPal支付流水记录入库：payment_transaction_paypal_ipn_t
     *
     * @param results
     * @return
     */
    Integer insertPayPalIpnResultsT(PayPalNotificationPaymentResults results);

    /**
     * payPal申诉退款等流水记录入库：payment_transaction_paypal_ipn_reversed_t
     *
     * @param results
     * @return
     */
    Integer insertPayPalReversedT(PayPalNotificationPaymentResults results);

    /**
     * 根据invoice_number和txnId查询支付结果是否已经入库
     *
     * @param invoice_number
     * @param paypal_id
     * @return
     */
    Integer findCountByInvoiceNumber(@Param("invoice_number") String invoice_number,
                                     @Param("paypal_id") String paypal_id);

    /**
     * payPal的webHook流水记录入库：payment_transaction_paypal_webhook_t
     *
     * @param results
     * @return
     */
    Integer insertPayPalWebHookResults(PayPalPaymentResults results);

    /**
     * 查询特殊设备是否已经入过库
     *
     * @param partnerCode
     * @param deviceCode
     * @return
     */
    Integer querySpecialDevice(@Param("partnerCode") String partnerCode,
                               @Param("deviceCode") String deviceCode);

    /**
     * 特殊设备生命周期记录入库
     *
     * @param device
     * @return
     */
    Integer insertSpecialDevice(PartnerSpecialDeviceLifecycle device);

    /**
     * 更新特殊设备订单记录的激活及时间
     *
     * @param re
     * @return
     */
    Integer updateSpecialDeviceOrderRecord(ServicePlanOrderRecord re);

    /**
     * 查询出需要展示微信支付的企业集合
     *
     * @return
     */
    List<PartnerShowWeChatPay> queryShowWeChatPayCodeList();

    /**
     * 去数据取出当前这条订单号对应的mark的值
     *
     * @param payId
     * @return
     */
    String queryMark(@Param("payId") String payId);

    /**
     * 查询当前这个订单还有没有未去订购的套餐isRequest=0表示没有2去订购过
     *
     * @param payId
     * @return
     */
    Integer queryNotPurchaseCount(@Param("payId") String payId);

    /**
     * 将ipn字符串入库
     *
     * @param results
     * @return
     */
    Integer insertIpnStr(PayPalNotificationPaymentResults results);


    /**
     * 入库：payment_transaction_stripe_t
     *
     * @param results
     * @return
     */
    Integer insertStripePayment(StripePaymentTransaction results);

    /**
     * 入库：service_plan_order_auto_renewal_record_t
     *
     * @param autoRecord
     * @return
     */
    Integer insertAutoRenewalRecord(ServicePlanOrderAutoRenewalRecord autoRecord);

    /**
     * 更新：service_plan_order_auto_renewal_record_t
     *
     * @param autoRecord
     * @return
     */
    Integer updateCancelAutoRenewalRecord(ServicePlanOrderAutoRenewalRecord autoRecord);

    /**
     * 根据订阅id号查询自动续费记录
     *
     * @param payId
     * @return
     */
    ServicePlanOrderAutoRenewalRecord queryAutoRecord(@Param("payId") String payId);

    /**
     * 根据回调来的id和pmId更新数据记录
     *
     * @param txnId
     * @param invoice
     * @param payRst
     * @param payId
     * @return
     */
    Integer updateAutoRenewalRecord(@Param("txnId") String txnId,
                                    @Param("invoice") String invoice,
                                    @Param("payRst") String payRst,
                                    @Param("payId") String payId);

    /**
     * 根据id查询自动续费记录payId
     *
     * @param txnId
     * @param pmId
     * @return
     */
    String queryPayIdById(@Param("txnId") String txnId,
                          @Param("pmId") String pmId);

    /**
     * 根据条件查询数据库里面是否具有这个记录
     *
     * @param txnId
     * @param payRst
     * @param payId
     * @param planId
     * @param pmId
     * @return
     */
    Integer queryRecordById(@Param("txnId") String txnId,
                            @Param("payRst") String payRst,
                            @Param("payId") String payId,
                            @Param("planId") String planId,
                            @Param("pmId") String pmId);

    /**
     * 写一条订单记录
     *
     * @param records
     * @return
     */
    Integer insertRecord(ServicePlanOrderRecord records);

    /**
     * 查询payment_transaction_stripe_t是否有这条记录
     *
     * @param description
     * @param txnId
     * @param invoice
     * @return
     */
    Integer findStripeResultsById(@Param("description") String description,
                                  @Param("txnId") String txnId,
                                  @Param("invoice") String invoice);

    /**
     * 查询企业的payPal的收款账户
     *
     * @param partnerCode
     * @param mode
     * @param available
     * @return
     */
    PartnerPayPalReceiveAccount queryAccountByCode(@Param("partnerCode") String partnerCode,
                                                   @Param("mode") String mode,
                                                   @Param("available") String available);
}
